最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java垃圾回收之標記清除算法詳解

 更新時間:2018年10月26日 15:43:25   作者:Sam哥哥  
今天小編就為大家分享一篇關于Java垃圾回收之標記清除算法詳解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧

java垃圾回收算法之-引用計數(shù)器,這個算法其中一個優(yōu)點便是,實時性,只要對象的引用計數(shù)器的值為0,則立刻回收。接下來介紹的標記清除算法,當對象的引用計數(shù)器的值為0時,不會立刻被回收的。

概念介紹

root對象

在標記清除算法中,會把如下對象稱之為root對象

  1. 被棧中的變量(棧中存的是對象的引用)所引用的對象
  2. 被static變量引用的對象

可訪問的對象

如果棧中有一個變量a引用了一個對象,那么該對象是可訪問的,如果該對象中的某一個字段引用了另一個對象b,那么b也是可訪問的。可訪問的對象也稱之為live對象

標記清除算法介紹

該算法有兩個階段。

1. 標記階段:找到所有可訪問的對象,做個標記
2. 清除階段:遍歷堆,把未被標記的對象回收

備注:

  • 該算法一般應用于老年代,因為老年代的對象生命周期比較長。

標記階段算法

偽代碼類似如下:

for each root variable r
  mark (r);
sweep ();

為了能夠區(qū)分對象是live的,可以為每個對象添加一個marked字段,該字段在對象創(chuàng)建的時候,默認值是false

假設有一個對象p,p對象還間接的引用了其他對象,那么可以使用一個遞歸算法去進行標記,例如:

void mark(Object p)
  if (!p.marked)
    p.marked = true;
    for each Object q referenced by p
      mark (q);

這個mark方法只有當所有對象已經(jīng)被mark后才會退出。

清除階段算法

在這個階段,需要去遍歷堆中所有對象,并找出未被mark的對象,進行回收。與此同時,那些被mark過的對象的marked字段的值會被重新設置為false,以便下次的垃圾回收。

偽代碼如下:

void sweep ()
  for each Object p in the heap
    if (p.marked)
      p.marked = false
    else
      heap.release (p);

下面用一張圖來表示標記清除算法的整個過程。

標記清除算法的優(yōu)點和缺點

1. 優(yōu)點
- 是可以解決循環(huán)引用的問題
- 必要時才回收(內(nèi)存不足時)

2. 缺點:
- 回收時,應用需要掛起,也就是stop the world。
- 標記和清除的效率不高,尤其是要掃描的對象比較多的時候
- 會造成內(nèi)存碎片(會導致明明有內(nèi)存空間,但是由于不連續(xù),申請稍微大一些的對象無法做到),如下圖:

解決循環(huán)引用

出現(xiàn)循環(huán)引用的代碼如下:

class TestA{
 public TestB b;
}
class TestB{
 public TestA a;
}
public class Main{
  public static void main(String[] args){
    A a = new A();
    B b = new B();
    a.b=b;
    b.a=a;
    a = null;
    b = null;
  }
}

對應的圖如下:

這個時候,當a = null; b = null;的時候,圖像變成如下:

那么使用標記清除算法是可以回收a和b的,原因是標記清除算法是從棧中根對象開始的,改算法走完后,a對象和b對象是沒有被標記的,會被直接回收。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。如果你想了解更多相關內(nèi)容請查看下面相關鏈接

相關文章

  • java模擬客戶端向服務器上傳文件

    java模擬客戶端向服務器上傳文件

    這篇文章主要為大家詳細介紹了java模擬客戶端向服務器上傳文件,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • Java 反射調(diào)用靜態(tài)方法的簡單實例

    Java 反射調(diào)用靜態(tài)方法的簡單實例

    下面小編就為大家?guī)硪黄狫ava 反射調(diào)用靜態(tài)方法的簡單實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-06-06
  • Java中的鎖與鎖的狀態(tài)升級詳細解讀

    Java中的鎖與鎖的狀態(tài)升級詳細解讀

    這篇文章主要介紹了Java中的鎖與鎖的狀態(tài)升級詳細解讀,Java 1.6以后官方針對鎖的優(yōu)化,主要是增加了兩種新的鎖:偏向鎖和輕量級鎖,再加上本身重量級鎖,那么鎖基本上可以大致分為這三種,它們之間的區(qū)別主要是體現(xiàn)在等待時間上面,需要的朋友可以參考下
    2024-01-01
  • 如何理解Java線程池及其使用方法

    如何理解Java線程池及其使用方法

    線程池是首先創(chuàng)建一些線程,它們的集合稱為線程池。使用線程池可以提高性能,它在系統(tǒng)啟動時創(chuàng)建大量空閑的線程,程序?qū)⒁粋€任務傳給線程池,它就會啟動一條線程來執(zhí)行這個任務,執(zhí)行結(jié)束以后,該線程并不會死亡,而是再次返回線程池中成為空閑狀態(tài),等待執(zhí)行下一個任務
    2021-06-06
  • springBoot 整合ModBus TCP的詳細過程

    springBoot 整合ModBus TCP的詳細過程

    ModBus是一種串行通信協(xié)議,用于從儀器和控制設備傳輸信號到主控制器或數(shù)據(jù)采集系統(tǒng),它分為主站和從站,主站獲取和編寫數(shù)據(jù),從站則是設備,本文給大家介紹springBoot 整合ModBus TCP的詳細過程,感興趣的朋友一起看看吧
    2025-01-01
  • Spring裝配Bean之用Java代碼安裝配置bean詳解

    Spring裝配Bean之用Java代碼安裝配置bean詳解

    這篇文章主要給大家介紹了關于Spring裝配Bean之用Java代碼安裝配置bean的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用spring具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧。
    2017-10-10
  • Spring Session的使用示例

    Spring Session的使用示例

    最近團隊一個項目需要使用Session,之前沒有在實際項目中使用過Spring-Session,這里記錄一下使用的過程
    2021-06-06
  • Java中transient關鍵字的詳細總結(jié)

    Java中transient關鍵字的詳細總結(jié)

    本文要介紹的是Java中的transient關鍵字,transient是短暫的意思。對于transient 修飾的成員變量,在類的實例對象的序列化處理過程中會被忽略,感興趣的朋友可以參考閱讀
    2023-04-04
  • Java?List集合取交集的8種不同實現(xiàn)方式總結(jié)

    Java?List集合取交集的8種不同實現(xiàn)方式總結(jié)

    工作中經(jīng)常遇到需要取兩個集合之間的交集、差集情況,下面這篇文章主要給大家總結(jié)介紹了關于Java?List集合取交集的8種不同實現(xiàn)方式,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-04-04
  • IDEA無法使用終端terminal問題的解決方案

    IDEA無法使用終端terminal問題的解決方案

    這篇文章主要介紹了IDEA無法使用終端terminal問題的解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09

最新評論

百色市| 镇安县| 平塘县| 阿尔山市| 鹤岗市| 莱芜市| 广州市| 福鼎市| 义马市| 来宾市| 苍溪县| 莱芜市| 华池县| 江津市| 双鸭山市| 平潭县| 时尚| 张家界市| 冀州市| 稷山县| 双峰县| 冷水江市| 滨海县| 乌海市| 江津市| 曲阜市| 延庆县| 双峰县| 株洲县| 阜城县| 体育| 香格里拉县| 茶陵县| 民权县| 上饶市| 镇江市| 旬阳县| 阳高县| 许昌市| 成安县| 金坛市|